home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / memory & system tools / copymemquicker / source / cm020.asm < prev    next >
Assembly Source File  |  1996-04-07  |  4KB  |  245 lines

  1.     xdef    Start20
  2.     xdef    Quicker20
  3.     xdef    Quickest20
  4.     xdef    CopyLen20
  5. Quicker20    equ    Quicker-Start20
  6. Quickest20    equ    Quickest-Start20
  7. CopyLen20    equ    Stop20-Start20
  8.  
  9. Start20
  10.     dc.l    '*Art'
  11. Quicker:
  12.     moveq    #16,d1
  13.     cmp.l    d1,d0
  14.     bcs.s    tinycpy
  15.     move.w    a0,d1
  16.     ror.l    #2,d1
  17.     move.w    a1,d1
  18.     rol.l    #2,d1
  19.     andi.w    #15,d1
  20.     beq.s    xa0la1l
  21.     move.w    tbl(pc,d1.w*2),d1
  22.     jmp    tbl(pc,d1.w)
  23.  
  24.     nop
  25.     nop
  26.  
  27. tbl    dc.w    xa0la1l-tbl
  28.     dc.w    xa0la11-tbl
  29.     dc.w    xa0la1e-tbl
  30.     dc.w    xa0la13-tbl
  31.     dc.w    xa01a1l-tbl
  32.     dc.w    xa01a11-tbl
  33.     dc.w    xa01a1e-tbl
  34.     dc.w    xa01a13-tbl
  35.     dc.w    xa0ea1l-tbl
  36.     dc.w    xa0ea11-tbl
  37.     dc.w    xa0ea1e-tbl
  38.     dc.w    xa0ea13-tbl
  39.     dc.w    xa03a1l-tbl
  40.     dc.w    xa03a11-tbl
  41.     dc.w    xa03a1e-tbl
  42.     dc.w    xa03a13-tbl
  43.  
  44. tloop1    move.b    (a0)+,(a1)+
  45. tinycpy    dbf    d0,tloop1
  46.     rts
  47.  
  48. xa01a13:
  49. xa03a11:
  50. xa03a13:
  51.     move.b    (a0)+,(a1)+
  52.     subq.l    #1,d0
  53.     bra.s    xa0la1l
  54.  
  55.     nop
  56.     nop
  57.     nop
  58.     nop
  59.     nop
  60.  
  61. xa01a11:
  62.     move.b    (a0)+,(a1)+
  63.     subq.l    #1,d0
  64. xa0ea1e:
  65.     move.w    (a0)+,(a1)+
  66.     subq.l    #2,d0
  67. xa0la1l:
  68. xa0la1e:
  69. xa0ea1l:
  70.     cmpi.l    #48*8,d0
  71.     bcs.s    smlmov
  72.     moveq    #48,d1        ; 12 registers of 4 bytes
  73.     sub.l    d1,d0
  74.     movem.l    d2-d7/a2-a6,-(sp)
  75. bigmov    movem.l    (a0)+,d1-d7/a2-a6
  76.     movem.l    d1-d7/a2-a6,(a1)
  77.     moveq    #48,d1
  78.     adda.l    d1,a1
  79.     sub.l    d1,d0
  80.     bcc.s    bigmov
  81.     add.w    d1,d0
  82.     movem.l    (sp)+,d2-d7/a2-a6
  83. smlmov    lsr.w    #1,d0
  84.     beq.s    even01
  85.     bcs.s    sm13
  86.     lsr.w    #1,d0
  87.     beq.s    even2
  88.     bcs.s    sm2
  89. sm0    subq.w    #1,d0
  90. loop0    move.l    (a0)+,(a1)+
  91.     dbf    d0,loop0
  92. even0    rts
  93.  
  94. even01    bcs.s    even1
  95.     rts
  96.  
  97. sm3    subq.w    #1,d0
  98. loop3    move.l    (a0)+,(a1)+
  99.     dbf    d0,loop3
  100. even3    move.w    (a0)+,(a1)+
  101. even1    move.b    (a0),(a1)
  102.     rts
  103.  
  104. sm13    lsr.w    #1,d0
  105.     beq.s    even3
  106.     bcs.s    sm3
  107. sm1    subq.w    #1,d0
  108. loop1    move.l    (a0)+,(a1)+
  109.     dbf    d0,loop1
  110.     move.b    (a0),(a1)
  111.     rts
  112.  
  113. sm2    subq.w    #1,d0
  114. loop2    move.l    (a0)+,(a1)+
  115.     dbf    d0,loop2
  116. even2    move.w    (a0),(a1)
  117.     rts
  118.  
  119. xa0ea11:
  120. xa0ea13:
  121.     move.w    (a0)+,d1
  122.     ror.w    #8,d1
  123.     move.b    d1,(a1)+
  124.     rol.w    #8,d1
  125.     move.b    d1,(a1)+
  126.     subq.l    #2,d0
  127.     bra.s    xa0la11
  128.  
  129. xa01a1l:
  130. xa01a1e:
  131.     move.b    (a0)+,(a1)+
  132.     move.b    (a0)+,(a1)+
  133.     subq.l    #2,d0
  134. xa03a1e:
  135. xa03a1l:
  136.     move.b    (a0)+,(a1)+
  137.     subq.l    #1,d0
  138.     bra.s    xa0la11
  139.  
  140. xa0la13:
  141. xa0la11:
  142.  
  143.     moveq    #36,d1        ; 8 regs of 4 bytes + roundoff bytes
  144.     cmp.l    d1,d0
  145.     bcs.s    tinycp2
  146. * This is tricky!  They said it couldn't be done...
  147. unevcpy    movem.l    a2-a4/d2-d7,-(sp)
  148.     movea.w    d1,a4
  149.     sub.l    d1,d0
  150.     movea.l    d0,a2
  151.     moveq    #32,d1        ; 8 registers of 4 bytes
  152.     movea.w    d1,a3
  153. uloop    movem.l    (a0)+,d0-d7
  154.     rol.l    #8,d0
  155.     rol.l    #8,d1
  156.     rol.l    #8,d2
  157.     rol.l    #8,d3
  158.     rol.l    #8,d4
  159.     rol.l    #8,d5
  160.     rol.l    #8,d6
  161.     rol.l    #8,d7
  162.     move.b    d0,(a1)+
  163.     move.b    d1,d0
  164.     move.b    d2,d1
  165.     move.b    d3,d2
  166.     move.b    d4,d3
  167.     move.b    d5,d4
  168.     move.b    d6,d5
  169.     move.b    d7,d6
  170.     move.b    (a0)+,d7
  171.     movem.l    d0-d7,(a1)
  172.     adda.l    a3,a1
  173.     move.b    (a0)+,(a1)+    ; even up to next word
  174.     move.b    (a0)+,(a1)+
  175.     move.b    (a0)+,(a1)+    ; ... and to next longword
  176.     suba.l    a4,a2
  177.     move.l    a2,d0
  178.     bpl.s    uloop
  179.     add.w    a4,d0
  180.     movem.l    (sp)+,a2-a4/d2-d7
  181. ;    subq.b    #1,d0
  182. ;    bcs.s    tdone
  183.     bra.s    tinycp2
  184. tloop2    move.b    (a0)+,(a1)+
  185. tinycp2    dbf    d0,tloop2
  186. tdone    rts
  187.  
  188.     nop
  189.     nop
  190.     nop
  191.     nop
  192.     nop
  193.     nop
  194.     dc.l    '*Art'
  195. Quickest
  196.     machine    mc68020
  197.     bftst    d0{0:16}
  198.     machine    mc68000
  199.     bne.s    bigq
  200.     lsr.w    #2,d0
  201.     cmp.w    #96,d0
  202.     bcs.s    smlmovQ
  203.     moveq    #12,d1
  204.     sub.w    d1,d0
  205.     divu.w    d1,d0
  206.     movem.l    d2-d7/a2-a6,-(sp)
  207. bigmovQ    movem.l    (a0)+,d1-d7/a2-a6
  208.     movem.l    d1-d7/a2-a6,(a1)
  209.     lea    48(a1),a1
  210.     dbf    d0,bigmovQ
  211.     swap    d0
  212.     movem.l    (sp)+,d2-d7/a2-a6
  213.     bra.s    smlmovQ
  214. qloop    move.l    (a0)+,(a1)+
  215. smlmovQ    dbf    d0,qloop
  216. done    rts
  217.  
  218. bigq    lsr.l    #2,d0
  219.     moveq    #48,d1
  220.     sub.l    d1,d0
  221.     nop
  222.     machine    mc68020
  223.     divul.l    d1,d1:d0
  224.     machine    mc68000
  225.     movem.l    d1-d7/a2-a6,-(sp)
  226. bmovQ2    movem.l    (a0)+,d1-d7/a2-a6
  227.     movem.l    d1-d7/a2-a6,(a1)
  228.     lea    48(a1),a1
  229.     movem.l    (a0)+,d1-d7/a2-a6
  230.     movem.l    d1-d7/a2-a6,(a1)
  231.     lea    48(a1),a1
  232.     movem.l    (a0)+,d1-d7/a2-a6
  233.     movem.l    d1-d7/a2-a6,(a1)
  234.     lea    48(a1),a1
  235.     movem.l    (a0)+,d1-d7/a2-a6
  236.     movem.l    d1-d7/a2-a6,(a1)
  237.     lea    48(a1),a1
  238.     dbf    d0,bmovQ2
  239.     sub.l    #$10000,d0
  240.     bcc.s    bmovQ2
  241.     movem.l    (sp)+,d0/d2-d7/a2-a6
  242.     bra.s    smlmovQ
  243.  
  244. Stop20
  245.